home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / dsp / 96000tar.z / 96000tar / 96000 / appb / b143b.asm < prev    next >
Assembly Source File  |  1992-04-28  |  4KB  |  151 lines

  1. ; This program was originally published in the Motorola DSP96002 Users Manual
  2. ; and is provided under a DISCLAIMER OF WARRANTY available from Motorola DSP
  3. ; Operation, 6501 William Cannon Drive West, Austin, Texas 78735-8598.  For
  4. ; more information, refer to the DSP96002 Users Manual, Appendix B, DSP
  5. ; Benchmarks.
  6. ;
  7. ; B.1.43.2    Integer Incremental Line Drawing Algorithm  
  8. ;This implementation of line drawing uses Bresenham's algorithm. This  algorithm uses only integer op-
  9. ;erations to generate the points.  
  10. ;  Bresenham Line Drawing Implementation 
  11. ;  When entering subroutine, the registers must 
  12. ;  be set as follows: 
  13. ;    d0 =          d4 = 
  14. ;    d1 =          d5 = 
  15. ;    d2 = x1       d6 = x0 
  16. ;    d3 = y1       d7 = y0 
  17. ;  When entering a line drawing loop, the registers 
  18. ;  are set as follows: 
  19. ;    d6 = x0 
  20. ;    d7 = y0 
  21. ;    d4 = dmajor 
  22. ;    d5 = n0 = dminor 
  23. ;    r0 = dmajor/2 
  24. ;    m0 = dmajor - 1 
  25.   org    p:$50 
  26. ; Calculate dx and dy 
  27. _line 
  28.   sub    d6,d2    d2.l,d4.l 
  29.   sub    d7,d3    d3.l,d5.l 
  30. ; Determine whether to increment x or y 
  31.   tst    d2       d2.l,d0.l 
  32.   neg    d2       iflt 
  33.   tst    d3       d3.l,d1.l 
  34.   neg    d3       iflt 
  35.   cmp    d3,d2 
  36.   jge    _inc_x 
  37. ; Increment y case 
  38. ; If dy is negative, switch endpoints and sign of dx and dy 
  39. _inc_y 
  40.   tst    d1 
  41.   tfr    d4,d6    iflt 
  42.   tfr    d5,d7    iflt 
  43.   neg    d1       iflt 
  44.   neg    d0       iflt 
  45.   tst    d0 
  46.   jlt    _set_y_xn 
  47.  
  48. ; Increment y, dx positive case 
  49. ; Set up registers 
  50. _set_y_xp 
  51.   lsr    d1       d1.l,d2.l 
  52.   dec    d2       d2.l,d4.l 
  53.   move            d1.l,r0 
  54.   move            d2.l,m0 
  55.   move            d0.l,n0 
  56.   move            d0.l,d5.l 
  57. ; Draw first point 
  58.   jsr   _draw_point 
  59. ; Draw additional points 
  60.   do    d4.l,_line_y_xp 
  61.   inc   d7       r0,d2.l 
  62.   add   d5,d2    (r0)+n0 
  63.   cmp   d4,d2 
  64.   inc   d6       ifge 
  65.   jsr   _draw_point 
  66. _line_y_xp 
  67.   rts 
  68. ; Increment y, dx negative case 
  69. ; Set up registers 
  70. _set_y_xn 
  71.   lsr    d1       d1.l,d2.l 
  72.   dec    d2       d2.l,d4.l 
  73.   neg    d0       d1.l,r0 
  74.   move            d2.l,m0 
  75.   move            d0.l,n0 
  76.   move            d0.l,d5.l 
  77. ; Draw first point 
  78.   jsr   _draw_point 
  79. ; Draw additional points 
  80.   do    d4.l,_line_y_xn 
  81.   inc   d7       r0,d2.l 
  82.   add   d5,d2    (r0)+n0 
  83.   cmp   d4,d2 
  84.   dec   d6       ifge 
  85.   jsr   _draw_point 
  86. _line_y_xn 
  87.   rts 
  88.  
  89. ; Increment x case 
  90. ; If dx is negative, switch endpoints and sign of dx and dy 
  91. _inc_x 
  92.   tst    d0 
  93.   jeq    _draw1 
  94.   tfr    d4,d6    iflt 
  95.   tfr    d5,d7    iflt 
  96.   neg    d0       iflt 
  97.   neg    d1       iflt 
  98.   tst    d1 
  99.   jlt    _set_x_yn 
  100. ; Increment x, dy positive case 
  101. ; Set up registers 
  102. _set_x_yp 
  103.   lsr    d0       d0.l,d2.l 
  104.   dec    d2       d2.l,d4.l 
  105.   move            d0.l,r0 
  106.   move            d2.l,m0 
  107.   move            d1.l,n0 
  108.   move            d1.l,d5.l 
  109. ; Draw first point 
  110.   jsr   _draw_point 
  111. ; Draw additional points 
  112.   do    d4.l,_line_x_yp 
  113.   inc   d6       r0,d2.l 
  114.   add   d5,d2    (r0)+n0 
  115.   cmp   d4,d2 
  116.   inc   d7       ifge 
  117.   jsr   _draw_point 
  118. _line_x_yp 
  119.   rts 
  120. ; Increment x, dy negative case 
  121. ; Set up registers 
  122. _set_x_yn 
  123.   lsr    d0       d0.l,d2.l 
  124.   dec    d2       d2.l,d4.l 
  125.   neg    d1       d0.l,r0 
  126.   move            d2.l,m0 
  127.   move            d1.l,n0 
  128.   move            d1.l,d5.l 
  129.  
  130. ; Draw first point 
  131.   jsr   _draw_point 
  132. ; Draw additional points 
  133.   do    d4.l,_line_x_yn 
  134.   inc   d6       r0,d2.l 
  135.   add   d5,d2    (r0)+n0 
  136.   cmp   d4,d2 
  137.   dec   d7       ifge 
  138. _draw1 
  139.   jsr   _draw_point 
  140. _line_x_yn 
  141.   rts 
  142. ; Draw a single point 
  143. _draw_point 
  144.   move           d6.l,x:(r1)+   d7.l,y: 
  145.   rts 
  146.  
  147.